﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using BOAcademias;
using TOAcademias;
using System.Data;
using System.Drawing;
using System.Globalization;

/*************************************
Autor: Carlos Sánchez
Fecha de Creación: 06/02/2011
Descripción de la Funcionalidad: Formulario que permite el registro de la matricula
del socio a las diferentes academias.
**************************************/   

public partial class TunkiFiles_Matricula_RegistrarMatricula : System.Web.UI.Page
{

    BOAcademia boAcademia = new BOAcademia();
    TOMatricula toMatricula = new TOMatricula();
    BOMatricula boMatricula = new BOMatricula();
    BOSeccion boSeccion = new BOSeccion();
    BOSocio boSocio = new BOSocio();
    BOMatriculaSeccion boMatriculaSeccion = new BOMatriculaSeccion();
    BOHorario boHorario = new BOHorario();

    void MostrarSecciones() 
    {
        gvSeccion.DataSource = ((List<TOSeccion>)Session["Secciones"]).FindAll(delegate(TOSeccion sec) { return sec.Academia == ddlAcademia.SelectedValue; });
        gvSeccion.DataBind();
    }

    void MostrarMatricula()
    {
        gvMatricula.DataSource = (List<TOMatriculaSeccion>)Session["Matricula"];
        gvMatricula.DataBind();
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            Session["Matricula"] = null;
            Session["Secciones"] = null;

            ddlAcademia.DataSource = boAcademia.obtenerAcademias();
            ddlAcademia.DataTextField = "Des_Academia";
            ddlAcademia.DataValueField = "Cod_Academia";
            ddlAcademia.DataBind();

            switch (Session["TipoUsuario"].ToString())
            {
                case "SOCIO":
                    txtCodSocio.Text = Session["CodigoPerfil"].ToString();
                    Session["CodSocio"] = txtCodSocio.Text;
                    btnBuscar_Click(sender, e);
                    txtCodSocio.ReadOnly = true;
                    gvSeccion.Enabled = true;
                    btnBuscar.Visible = false;
                    break;
            }

        }
        if (Convert.ToBoolean(Session["VerHorario"]) == true)
        {
            btnHorario_ModalPopupExtender.Show();
        }
        lblMensaje.Text = "";
        lblMensajeSeccion.Text="";
    }


    #region Iniciar Matricula

    protected void btnInicioMatricula_Click(object sender, EventArgs e)
    {
        boMatricula = new BOMatricula();
        toMatricula = new TOMatricula();
        BOPeriodo boPeriodo = new BOPeriodo();
        TOPeriodo toPeriodo = boPeriodo.obtenerPeriodoActivo();
        toMatricula.CodigoPeriodo = toPeriodo.Codigo;
        toMatricula.CodigoSocio = Session["CodSocio"].ToString();
        boMatricula.insertarMatricula(toMatricula);

        pnlIniciarMatricula.Visible = false;
        pnlRegistroMatricula.Visible = true;
        pnlHorario.Visible = true;
        btnBuscar_Click(sender, e);
    }

    protected void btnCancelarMatricula_Click(object sender, EventArgs e)
    {
        Response.Redirect("http://localhost:2882/TunkiWeb/TunkiFiles/Inicio.aspx");
    }

    #endregion


    protected void btnBuscar_Click(object sender, EventArgs e)
    {
        String strCodSocio = txtCodSocio.Text.Trim();

        TOSocio toSocio = boSocio.obtenerSocioxCodigo(strCodSocio);
        if (toSocio != null)
        {
            lblNomSocio.Text = toSocio.Nombre.ToString();

            //Verificar si el socio tiene matricula en el periodo actual
            boMatricula = new BOMatricula();
            TOMatricula toMatricula = boMatricula.obtenerMatriculaxSocio(strCodSocio);
            if (toMatricula != null)
            {
                lblCodMatricula.Text = toMatricula.CodigoMatricula.ToString();
                lblCodMatricula.Enabled = false;
                lblMensaje.Text = String.Empty;
                ddlAcademia.Enabled = true;
                gvSeccion.Enabled = true;
                btnHorarioMatricula.Enabled = true;
                btnGuardar.Enabled = true;
                btnCancelar.Enabled = true;

                Session["CodSocio"] = strCodSocio;
                Session["Secciones"] = boSeccion.obtenerSeccionesActivasxSocio(strCodSocio);
                Session["Matricula"] = boMatriculaSeccion.obtenerMatriculaSeccionxSocio(strCodSocio);
                GenerarHorarioTemporalSocio();
                MostrarSecciones();
                MostrarMatricula();
            }
            else
            {
                Session["CodSocio"] = strCodSocio;
                pnlIniciarMatricula.Visible = true;
                pnlRegistroMatricula.Visible = false;
                pnlHorario.Visible = false;
            }
        }
        else
        {
            lblMensaje.Text = "Código No Existe";
            lblCodMatricula.Text = String.Empty;
            lblNomSocio.Text = String.Empty;
            ddlAcademia.Enabled = false;
            gvSeccion.Enabled = false;
            btnHorarioMatricula.Enabled = false;
            btnGuardar.Enabled = false;
            btnCancelar.Enabled = false;

            gvSeccion.DataBind();
            gvMatricula.DataBind();
        }

        gvSeccion.SelectedIndex = -1;        
    }

    protected void ddlAcademia_SelectedIndexChanged(object sender, EventArgs e)
    {
        MostrarSecciones();
        MostrarMatricula();
        gvSeccion.SelectedIndex = -1;
    }


     protected void chkSeleccion_CheckedChanged(object sender, EventArgs e)
    {

        lblMensajeSeccion.Text = "";
        foreach (GridViewRow gvrSeccion in gvSeccion.Rows)
        {
            CheckBox chkSelected = (CheckBox)gvrSeccion.FindControl("chkSeleccion");
            String strCodSeccion = gvrSeccion.Cells[0].Text;

            TOSeccion toSeccion = ((List<TOSeccion>)Session["Secciones"]).Find(delegate(TOSeccion sec) { return sec.Cod_seccion == strCodSeccion; });
            if (chkSelected.Checked == true)
            {
                Int32 intCapacidad = Convert.ToInt32(gvrSeccion.Cells[4].Text);
                Int32 intCanMatriculados = Convert.ToInt32(gvrSeccion.Cells[5].Text);
                if (intCanMatriculados < intCapacidad)
                {
                    String strValidaHorario = ValidarHorarioxSocio(strCodSeccion, Session["CodSocio"].ToString());
                    if (strValidaHorario == "")
                    {
                        if (toSeccion.EstadoAuxiliar == false)
                        {
                            //Actualizar Matricula Temporal
                            TOMatriculaSeccion toMatriculaSeccion = new TOMatriculaSeccion();
                            toMatriculaSeccion.CodigoSeccion = strCodSeccion;
                            toMatriculaSeccion.CodigoMatricula = lblCodMatricula.Text;
                            toMatriculaSeccion.Fecha = DateTime.Today;
                            toMatriculaSeccion.Academia = ddlAcademia.SelectedItem.Text;
                            ((List<TOMatriculaSeccion>)Session["Matricula"]).Add(toMatriculaSeccion);

                            //Actualizar Horario Temporal
                            List<TOHorario> tolistaHorario = boHorario.obtenerHorariosxSec(strCodSeccion);
                            foreach (TOHorario toHorario in tolistaHorario)
                            {
                                ((List<TOHorario>)Session["Horario"]).Add((toHorario));
                            }
                        }
                        toSeccion.EstadoAuxiliar = true;
                    }
                    else
                    {
                        lblMensajeSeccion.Text = strValidaHorario;
                        break;
                    }
                }
                else
                {
                    lblMensajeSeccion.Text = "La Sección " + gvrSeccion.Cells[0].Text + " ya completo su capacidad.";
                }
            }
            else
            {
                if (toSeccion.EstadoAuxiliar == true)
                {
                    //Actualizar Matricula Temporal
                    TOMatriculaSeccion toMatriculaSeccion = new TOMatriculaSeccion();
                    toMatriculaSeccion = ((List<TOMatriculaSeccion>)Session["Matricula"]).Find(delegate(TOMatriculaSeccion mat) { return mat.CodigoSeccion == strCodSeccion; });
                    ((List<TOMatriculaSeccion>)Session["Matricula"]).Remove(toMatriculaSeccion);

                    //Actualizar Horario Temporal
                    List<TOHorario> tolistaHorario = boHorario.obtenerHorariosxSec(strCodSeccion);
                    foreach (TOHorario toHorario in tolistaHorario)
                    {
                        TOHorario toHorarioTemp = new TOHorario();
                        toHorarioTemp = ((List<TOHorario>)Session["Horario"]).Find(delegate(TOHorario hor) { return hor.Cod_seccion == strCodSeccion; });
                        ((List<TOHorario>)Session["Horario"]).Remove((toHorarioTemp));
                    }
                }
                toSeccion.EstadoAuxiliar = false;

            }

        }
        MostrarSecciones();
        MostrarMatricula();
    }


    protected void gvSeccion_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        String strComando = e.CommandName.ToString();
        Int32 intFila = Convert.ToInt32(e.CommandArgument.ToString());

        gvSeccion.SelectedIndex = intFila;
        GridViewRow gvrSeccion = gvSeccion.SelectedRow;
        switch (strComando)
        {
            case "Horario":
                String strCodigoSeccion = gvrSeccion.Cells[0].Text;
                habilitarHorarioxSeccion(strCodigoSeccion);
                Session["VerHorario"] = true;
                btnHorario_ModalPopupExtender.Show();
                break;
        }
    }

    protected void btnHorarioMatricula_Click(object sender, EventArgs e)
    {
        habilitarHorarioxSocio(Session["CodSocio"].ToString());
        Session["VerHorario"] = true;
        btnHorario_ModalPopupExtender.Show();
    }

    protected void gvMatricula_DataBound(object sender, EventArgs e)
    {
        lblMonto.Text = String.Format("{0:0.00}", gvMatricula.Rows.Count * 100);
    }

    protected void btnGuardar_Click(object sender, EventArgs e)
    {
        String strCodSocio = Session["CodSocio"].ToString(); 
        if (strCodSocio == txtCodSocio.Text)
        {            
            List<TOMatriculaSeccion> listaMatriculaSeccionOriginal = boMatriculaSeccion.obtenerMatriculaSeccionxSocio(strCodSocio);
            List<TOMatriculaSeccion> listaMatriculaSeccionActual = (List<TOMatriculaSeccion>)Session["Matricula"];
            

            if (listaMatriculaSeccionOriginal != listaMatriculaSeccionActual)
            {
                boMatriculaSeccion.eliminarMatriculaSeccionxMatricula(lblCodMatricula.Text);
                foreach (TOMatriculaSeccion toMatriculaSeccion in listaMatriculaSeccionActual)
                {
                    boMatriculaSeccion.insertarMatriculaSeccion(strCodSocio, toMatriculaSeccion);
                }
            }

            Session["Secciones"] = boSeccion.obtenerSeccionesActivasxSocio(strCodSocio);
            Session["Matricula"] = boMatriculaSeccion.obtenerMatriculaSeccionxSocio(strCodSocio);
            GenerarHorarioTemporalSocio();
            MostrarSecciones();
            MostrarMatricula();
            if (Session["CodigoPerfil"].ToString() != "SOCIO")
            {
                lblCodMatricula.Enabled = true;
            }
        }
        else
        {
            lblMensaje.Text = "El Código de Socio (" + txtCodSocio.Text + "), no corresponde al Socio de la Matricula Actual ("+strCodSocio+").";
        }
    }

    protected void btnCancelar_Click(object sender, EventArgs e)
    {
        String strCodSocio = Session["CodSocio"].ToString();

        Session["Secciones"] = boSeccion.obtenerSeccionesActivasxSocio(strCodSocio);
        Session["Matricula"] = boMatriculaSeccion.obtenerMatriculaSeccionxSocio(strCodSocio);
        GenerarHorarioTemporalSocio();
        MostrarSecciones();
        MostrarMatricula();
        if (Session["CodigoPerfil"].ToString() != "SOCIO")
        {
            lblCodMatricula.Enabled = true;
            txtCodSocio.Text = Session["CodSocio"].ToString();
        }
    }



    #region Horarios


    private List<Button> FindControlRecursive(Control ctlRoot)
    {
        List<Button> listaBotones = new List<Button>();
        if (ctlRoot.ID != null)
        {
            if (ctlRoot.ID.Length == 6)
            {
                string strAux = ctlRoot.ID.Substring(0, 3);
                if (strAux.Equals("btn"))
                    listaBotones.Add((Button)ctlRoot);
            }
        }
        foreach (Control ctlC in ctlRoot.Controls)
        {
            List<Button> listaBoton = FindControlRecursive(ctlC);
            if (listaBoton != null)
            {
                foreach (Button btn in listaBoton)
                {
                    listaBotones.Add(btn);
                }
            }
        }

        return listaBotones;
    }

    public void habilitarHorarioxSeccion(String CodigoSeccion)
    {
        List<Button> listaBotones = FindControlRecursive(pnlHorario);
        List<TOHorario> listaHorario = boHorario.obtenerHorariosxSec(CodigoSeccion);

        foreach (Button btnBoton in listaBotones)
        {
            btnBoton.Height = 20;
            btnBoton.Font.Size = 8;
            btnBoton.BackColor = Color.White;
            btnBoton.Text = String.Empty;
            TOHorario toHorario = listaHorario.Find(delegate(TOHorario bk)
            {

                string strHora = "" + bk.Hora.ToString();
                string strButtonName = "btn" + bk.Dia.ToString() + "00";

                strButtonName = strButtonName.Substring(0, 6 - strHora.Length) + strHora;
                return btnBoton.ID == strButtonName;
            });


            if (toHorario != null)
            {
                btnBoton.BackColor = Color.Red;
                btnBoton.Text = toHorario.Cod_infraestructura;
            }

        }
    }

    public void habilitarHorarioxSocio(String CodigoSocio)
    {
        List<Button> listaBotones = FindControlRecursive(pnlHorario);
        List<TOHorario> listaHorario = (List<TOHorario>)Session["Horario"]; //boHorario.obtenerHorariosxSocio(CodigoSocio);

        foreach (Button btnBoton in listaBotones)
        {
            btnBoton.Height = 30;
            btnBoton.Font.Size = 8;
            btnBoton.BackColor = Color.White;
            btnBoton.Text = String.Empty;
            TOHorario toHorario = listaHorario.Find(delegate(TOHorario bk)
            {

                string strHora = "" + bk.Hora.ToString();
                string strButtonName = "btn" + bk.Dia.ToString() + "00";

                strButtonName = strButtonName.Substring(0, 6 - strHora.Length) + strHora;
                return btnBoton.ID == strButtonName;
            });


            if (toHorario != null)
            {
                if (btnBoton.BackColor == Color.White)
                    btnBoton.BackColor = Color.Red;
                else
                    btnBoton.BackColor = Color.Violet;
                btnBoton.Text = toHorario.Cod_infraestructura + "\n" + toHorario.Cod_seccion;
            }

        }
    }

    void GenerarHorarioTemporalSocio()
    {
        List<TOHorario> listaHorarioSocio = new List<TOHorario>();
        //Generar Horario según la matricula temporal
        foreach (TOMatriculaSeccion toMatricula in (List<TOMatriculaSeccion>)Session["Matricula"])
        {
            List<TOHorario> tolistaHorario = boHorario.obtenerHorariosxSec(toMatricula.CodigoSeccion);// listaHorarioSocio.Find(delegate(TOHorario hor) { return hor.Cod_seccion == toMatricula.CodigoSeccion; });
            foreach (TOHorario toHorario in tolistaHorario)
            {
                listaHorarioSocio.Add(toHorario);
            }
        }
        Session["Horario"] = listaHorarioSocio;
    }


    String ValidarHorarioxSocio(String CodigoSeccion, String CodigoSocio)
    {

        String strCruce = String.Empty;
        List<TOHorario> listaHorarioSeccion = boHorario.obtenerHorariosxSec(CodigoSeccion);
        List<TOHorario> listaHorarioSocio = (List<TOHorario>)Session["Horario"]; //boHorario.obtenerHorarios();// xSocio(CodigoSocio);

        foreach (TOHorario toSeccion in listaHorarioSeccion)
        {
            Int32 intDiaSeccion = toSeccion.Dia;
            Int32 intHoraSeccion = toSeccion.Hora;
            foreach (TOHorario toSocio in listaHorarioSocio)
            {
                Int32 intDiaSocio = toSocio.Dia;
                Int32 intHoraSocio = toSocio.Hora;
                if (toSeccion.Cod_seccion != toSocio.Cod_seccion)
                {
                    if (intDiaSeccion == intDiaSocio && intHoraSeccion == intHoraSocio)
                    {
                        if (intDiaSocio == 6) intDiaSocio = -1;
                        DayOfWeek day = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), (intDiaSocio + 1).ToString());
                        String strDiaSemana = CultureInfo.GetCultureInfo("es-ES").DateTimeFormat.GetDayName(day).ToUpper();
                        strCruce += "Existe un cruce de Horario el Día: " + strDiaSemana + " a las " + String.Format("{0}:00", intHoraSocio) + " con la sección " + toSocio.Cod_seccion + " <br>";
                        //break;
                    }
                }
            }
        }


        return strCruce;
    }

    protected void Button1_Click1(object sender, EventArgs e)
    {
    }

    protected void btnCerrar_Click(object sender, EventArgs e)
    {
        Session["VerHorario"] = false;
        btnHorario_ModalPopupExtender.Hide();
    }

    #endregion






}